package B2;

import java.util.Timer;
import java.util.TimerTask;

/**
 * SafeHome控制面板状态机
 * 实现状态图中的状态转移、密码验证、锁定计时逻辑
 */
public class ControlPanelStateMachine {
    private PanelState currentState;       // 当前状态
    private int errorCount = 0;            // 密码错误次数
    private static final int MAX_ERROR = 3;// 最大错误次数（3次锁定）
    private static final long LOCK_DURATION = 120000; // 锁定时长（120秒，毫秒）
    private Timer lockTimer;               // 锁定计时器

    // 构造方法：初始化状态为「读取键入字符」
    public ControlPanelStateMachine() {
        this.currentState = PanelState.READING_INPUT;
    }

    /**
     * 处理密码输入逻辑
     * @param input  用户输入的密码（固定4位）
     * @param correctPassword 系统预设的正确密码
     */
    public void processPassword(String input, String correctPassword) {
        // 非「读取输入」状态，拒绝处理
        if (currentState != PanelState.READING_INPUT) {
            System.out.println("当前状态：" + currentState + " → 无法输入密码");
            return;
        }

        // 验证密码长度（强制4位）
        if (input.length() != 4) {
            System.out.println("密码长度错误（需4位），请重新输入");
            return;
        }

        // 密码正确：转移到「功能选择」状态
        if (input.equals(correctPassword)) {
            currentState = PanelState.FUNCTION_SELECT;
            errorCount = 0; // 重置错误次数
            System.out.println("密码正确 → 进入【系统功能选择状态】");
        } else {
            // 密码错误：累计次数，判断是否锁定
            errorCount++;
            if (errorCount >= MAX_ERROR) {
                currentState = PanelState.LOCKED;
                System.out.println("密码错误" + errorCount + "次 → 进入【控制面板锁定状态】（锁定120秒）");
                startLockTimer(); // 启动解锁计时器
            } else {
                System.out.println("密码错误（" + errorCount + "次）→ 仍处于【读取键入字符状态】，请重新输入");
            }
        }
    }

    /**
     * 启动锁定计时器：120秒后自动解锁，恢复「读取输入」状态
     */
    private void startLockTimer() {
        if (lockTimer != null) {
            lockTimer.cancel(); // 取消原有计时器（避免重复）
        }
        lockTimer = new Timer();
        lockTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                currentState = PanelState.READING_INPUT;
                errorCount = 0; // 重置错误次数
                System.out.println("锁定时长已满（120秒）→ 解锁，恢复【读取键入字符状态】");
            }
        }, LOCK_DURATION);
    }

    // 获取当前状态（供测试/外部调用）
    public PanelState getCurrentState() {
        return currentState;
    }

    // 取消计时器（避免内存泄漏）
    public void cancelTimer() {
        if (lockTimer != null) {
            lockTimer.cancel();
        }
    }
}